package main

import (
	"fmt"
)

// PersonInfo是一个包含个人详细信息的类型
type PersonInfo struct {
	ID      string
	Name    string
	Address string
}

func main() {
	//	// 变量声明
	//	var personDB map[string]PersonInfo
	//	//  make() 来创建一个新 map
	//	personDB = make(map[string]PersonInfo)
	//	//	personDB := make(map[string]PersonInfo)
	//	// myMap = make(map[string] PersonInfo, 100) // 创建了一个初始存储能力为100的 map
	//	// 创建并初始化 map 的代码如下：
	//	//	myMap = map[string]PersonInfo{
	//	//		"1234": PersonInfo{"1", "Jack", "Room 101,..."},
	//	//	}

	//	// 往这个map里插入几条数据
	//	personDB["12345"] = PersonInfo{"12345", "Tom", "Room 203,..."}
	//	personDB["1"] = PersonInfo{"1", "Jack", "Room 101,..."}
	//	// 元素删除
	//	delete(personDB, "1")
	//	// 从这个map查找键为"1234"的信息
	//	person, ok := personDB["12345"]
	//	// ok是一个返回的bool型，返回true表示找到了对应的数据
	//	if ok {
	//		fmt.Println("Found person", person.Name, "with ID 12345.")
	//	} else {
	//		fmt.Println("Did not find person with ID 12345.")
	//	}

	// 指针
	//	b := 255
	//	var a *int = &b
	//	fmt.Printf("Type of a is %T\n", a) // 类型
	//	fmt.Println("address of b is", a)  // 地址

	// 指针的空值
	// 指针的空值为 nil

	// 指针解引用:通过指针访问被指向的值
	//	b := 255
	//	a := &b
	//	fmt.Println("address of b is", a)
	//	fmt.Println("value of b is", *a)
	//	// 指针改变 b 的值
	//	*a++
	//	fmt.Println("new value of b is", b)
	//	*a = 10
	//	fmt.Println("new value of b is", b)
	//	fmt.Println("new value of b is", *a)

	// 传递指针给函数
	a := 58
	fmt.Println("value of a before function call is", a)
	b := &a
	change(b)
	fmt.Println("value of a after function call is", a)
	str := `hello world`
	fmt.Println(str[0:10])
	// 不要传递指向数组的指针给函数，而是使用切片
	// 假设我们需要通过函数修改一个数组。一个办法是将数组的指针作为参数传递给函数。
	//	a := [3]int{89, 90, 91}
	//	modify(&a) // 指针
	//	fmt.Println(a)

	// 虽然可以通过传递数组指针给函数的方式来修改原始数组的值，但这在 Go 中不是惯用的方式，我们可以使用切片完成同样的事情。
	//	modifySlice(a[:])
	//	fmt.Println(a)
}

// 指针
func change(val *int) {
	*val = 55
}

func modifySlice(sls []int) {
	sls[0] = 50
}

func modify(arr *[3]int) {
	// 两种写法都对
	(*arr)[0] = 90
	arr[0] = 90
}
